package algorithm;

public class Freeman{
	private int[] codage= new int[1000];		// le codage de l'image sous forme de Freeman
	private int[] deplX={-1,-1,0,1,1,1,0,-1};	// les d�placements par rapport � l'axe des X
	private int[] deplY={0,1,1,1,0,-1,-1,-1};	// les d�placements par rapport � l'axe des Y
	private int[][] image={{0,0,0,0,0},{0,1,1,0,0},{0,0,1,1,0},{0,0,0,1,0},{0,0,0,0,0}};
	int Xo=1, Yo=1;
	int codageLength;
	int precedente=3;
	
/*	public static void main(String[] args){
		new Freeman().coding();
	}*/
	
	public Freeman(int[][] image, int Xo, int Yo){
		this.image=image;
		this.Xo=Xo;
		this.Yo=Yo;
		this.coding();
	}
			
	public void coding(){
		int positionX=Xo;
		int positionY=Yo;
		int direction;
		int d;
		int c=0;						// variable de parcours de codage
		do{
			direction=(precedente + 6) % 8;
			for (int pas = 0; pas<=5; pas++){
				d=(direction + pas) % 8;
				//System.out.println(d);
				if(image[positionX + deplX[d]][positionY + deplY[d]]==1){
					precedente=d;
					positionX+=deplX[d];
					positionY+=deplY[d];
					codage[c]=d;
					c++;
					break;
				}
			}
			//System.out.println("positionX="+positionX + "positionY"+positionY);
		}while(positionX!=Xo || positionY!=Yo);
		codageLength = c;
		for(int a=0;a<codageLength;a++)
			System.out.println(codage[a]);
	}
	
	public int getXo(){
		return this.Xo;
	}
	
	public int getYo(){
		return this.Yo;
	}
	public int[] getCodage(){
		return this.codage;
	}
	
	public int getCodageLength(){
		return this.codageLength;
	}
}
	
/*	
	codage[]; // le codage de l'image sous forme de Freeman
 	deplX[]={0,1,1,1,0,-1,-1,-1}; // les d�placements par rapport � l'axe des X
	deplY[]={1,1,0,-1,-1,-1,0,1}; // les d�placements par rapport � l'axe des Y 
	c<-0; // variable de parcours de codage
	x<-x0;
	y<-y0;
	pr�c�dente<-3;
	R�p�ter{
   	Direction<-(pr�c�dente+6)%8;
   	Pour pas<-0 � 5 faire{
      d<-(direction+pas)%8;
      si Image[x+deplX[d], y+deplY[d]] == NOIR{
         pr�c�dente<-d;
         x<-x+deplX[d];
         y<-y+deplY[d];
         codage[c]<-d;
         c++;
         Sortir du Pour;
      	}
   		}
	}(Tant que x!=x0, y!=y0)
*/
